package handler

import (
	"fitness/go-admin/internal/model"
	"fitness/go-admin/internal/service"
	"fitness/go-admin/pkg/response"
	"strconv"

	"github.com/gin-gonic/gin"
)

// EmojiHandler 表情处理器
type EmojiHandler struct {
	service service.EmojiService
}

// NewEmojiHandler 创建表情处理器
func NewEmojiHandler(service service.EmojiService) *EmojiHandler {
	return &EmojiHandler{
		service: service,
	}
}

// ==================== 表情分类管理（仅管理员） ====================

// CreateEmojiCategory 创建表情分类
// @Summary 创建表情分类
// @Description 创建表情分类（仅管理员）
// @Tags 表情管理-分类
// @Accept json
// @Produce json
// @Security Bearer
// @Param request body model.CreateEmojiCategoryReq true "创建请求"
// @Success 200 {object} response.Response{data=model.EmojiCategory}
// @Router /api/v1/emojis/categories [post]
func (h *EmojiHandler) CreateEmojiCategory(c *gin.Context) {
	var req model.CreateEmojiCategoryReq
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, 400, "参数错误")
		return
	}

	category, err := h.service.CreateEmojiCategory(&req)
	if err != nil {
		response.Error(c, 400, err.Error())
		return
	}

	response.Success(c, category, "创建成功")
}

// GetEmojiCategory 获取表情分类详情
// @Summary 获取表情分类详情
// @Description 获取单个表情分类的详细信息
// @Tags 表情管理-分类
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "分类ID"
// @Success 200 {object} response.Response{data=model.EmojiCategory}
// @Router /api/v1/emojis/categories/{id} [get]
func (h *EmojiHandler) GetEmojiCategory(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.Error(c, 400, "ID格式错误")
		return
	}

	category, err := h.service.GetEmojiCategory(uint(id))
	if err != nil {
		response.Error(c, 404, err.Error())
		return
	}

	response.Success(c, category, "")
}

// GetEmojiCategoryList 获取表情分类列表
// @Summary 获取表情分类列表
// @Description 获取表情分类列表，支持筛选
// @Tags 表情管理-分类
// @Accept json
// @Produce json
// @Security Bearer
// @Param isEnabled query bool false "是否启用"
// @Param page query int false "页码"
// @Param pageSize query int false "每页数量"
// @Success 200 {object} response.Response{data=model.EmojiCategoryListResp}
// @Router /api/v1/emojis/categories [get]
func (h *EmojiHandler) GetEmojiCategoryList(c *gin.Context) {
	var req model.EmojiCategoryListReq
	if err := c.ShouldBindQuery(&req); err != nil {
		response.Error(c, 400, "参数错误")
		return
	}

	result, err := h.service.GetEmojiCategoryList(&req)
	if err != nil {
		response.Error(c, 500, err.Error())
		return
	}

	response.Success(c, result, "")
}

// UpdateEmojiCategory 更新表情分类
// @Summary 更新表情分类
// @Description 更新表情分类信息（仅管理员）
// @Tags 表情管理-分类
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "分类ID"
// @Param request body model.UpdateEmojiCategoryReq true "更新请求"
// @Success 200 {object} response.Response
// @Router /api/v1/emojis/categories/{id} [put]
func (h *EmojiHandler) UpdateEmojiCategory(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.Error(c, 400, "ID格式错误")
		return
	}

	var req model.UpdateEmojiCategoryReq
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, 400, "参数错误")
		return
	}

	if err := h.service.UpdateEmojiCategory(uint(id), &req); err != nil {
		response.Error(c, 400, err.Error())
		return
	}

	response.Success(c, nil, "更新成功")
}

// DeleteEmojiCategory 删除表情分类
// @Summary 删除表情分类
// @Description 删除表情分类（仅管理员）
// @Tags 表情管理-分类
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "分类ID"
// @Success 200 {object} response.Response
// @Router /api/v1/emojis/categories/{id} [delete]
func (h *EmojiHandler) DeleteEmojiCategory(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.Error(c, 400, "ID格式错误")
		return
	}

	if err := h.service.DeleteEmojiCategory(uint(id)); err != nil {
		response.Error(c, 400, err.Error())
		return
	}

	response.Success(c, nil, "删除成功")
}

// ==================== 表情管理（仅管理员） ====================

// CreateEmoji 创建表情
// @Summary 创建表情
// @Description 创建表情（仅管理员）
// @Tags 表情管理-表情
// @Accept json
// @Produce json
// @Security Bearer
// @Param request body model.CreateEmojiReq true "创建请求"
// @Success 200 {object} response.Response{data=model.Emoji}
// @Router /api/v1/emojis/items [post]
func (h *EmojiHandler) CreateEmoji(c *gin.Context) {
	userID := c.GetUint("userID")

	var req model.CreateEmojiReq
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, 400, "参数错误")
		return
	}

	emoji, err := h.service.CreateEmoji(userID, &req)
	if err != nil {
		response.Error(c, 400, err.Error())
		return
	}

	response.Success(c, emoji, "创建成功")
}

// GetEmoji 获取表情详情
// @Summary 获取表情详情
// @Description 获取单个表情的详细信息
// @Tags 表情管理-表情
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "表情ID"
// @Success 200 {object} response.Response{data=model.Emoji}
// @Router /api/v1/emojis/items/{id} [get]
func (h *EmojiHandler) GetEmoji(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.Error(c, 400, "ID格式错误")
		return
	}

	emoji, err := h.service.GetEmoji(uint(id))
	if err != nil {
		response.Error(c, 404, err.Error())
		return
	}

	response.Success(c, emoji, "")
}

// GetEmojiList 获取表情列表
// @Summary 获取表情列表
// @Description 获取表情列表，支持筛选和搜索
// @Tags 表情管理-表情
// @Accept json
// @Produce json
// @Security Bearer
// @Param categoryId query int false "分类ID"
// @Param type query string false "类型"
// @Param isEnabled query bool false "是否启用"
// @Param keyword query string false "关键词搜索"
// @Param page query int false "页码"
// @Param pageSize query int false "每页数量"
// @Success 200 {object} response.Response{data=model.EmojiListResp}
// @Router /api/v1/emojis/items [get]
func (h *EmojiHandler) GetEmojiList(c *gin.Context) {
	var req model.EmojiListReq
	if err := c.ShouldBindQuery(&req); err != nil {
		response.Error(c, 400, "参数错误")
		return
	}

	result, err := h.service.GetEmojiList(&req)
	if err != nil {
		response.Error(c, 500, err.Error())
		return
	}

	response.Success(c, result, "")
}

// UpdateEmoji 更新表情
// @Summary 更新表情
// @Description 更新表情信息（仅管理员）
// @Tags 表情管理-表情
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "表情ID"
// @Param request body model.UpdateEmojiReq true "更新请求"
// @Success 200 {object} response.Response
// @Router /api/v1/emojis/items/{id} [put]
func (h *EmojiHandler) UpdateEmoji(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.Error(c, 400, "ID格式错误")
		return
	}

	var req model.UpdateEmojiReq
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, 400, "参数错误")
		return
	}

	if err := h.service.UpdateEmoji(uint(id), &req); err != nil {
		response.Error(c, 400, err.Error())
		return
	}

	response.Success(c, nil, "更新成功")
}

// DeleteEmoji 删除表情
// @Summary 删除表情
// @Description 删除表情（仅管理员）
// @Tags 表情管理-表情
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "表情ID"
// @Success 200 {object} response.Response
// @Router /api/v1/emojis/items/{id} [delete]
func (h *EmojiHandler) DeleteEmoji(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.Error(c, 400, "ID格式错误")
		return
	}

	if err := h.service.DeleteEmoji(uint(id)); err != nil {
		response.Error(c, 400, err.Error())
		return
	}

	response.Success(c, nil, "删除成功")
}

// ==================== 前端获取表情包（所有用户） ====================

// GetEmojis 获取所有表情包
// @Summary 获取所有表情包
// @Description 获取所有启用的表情包（按分类组织）
// @Tags 表情管理-前端
// @Accept json
// @Produce json
// @Security Bearer
// @Success 200 {object} response.Response{data=model.GetEmojisResp}
// @Router /api/v1/emojis [get]
func (h *EmojiHandler) GetEmojis(c *gin.Context) {
	result, err := h.service.GetEmojis()
	if err != nil {
		response.Error(c, 500, err.Error())
		return
	}

	response.Success(c, result, "")
}

// GetHotEmojis 获取热门表情
// @Summary 获取热门表情
// @Description 获取使用频率最高的表情
// @Tags 表情管理-前端
// @Accept json
// @Produce json
// @Security Bearer
// @Param limit query int false "数量限制"
// @Success 200 {object} response.Response{data=[]model.Emoji}
// @Router /api/v1/emojis/hot [get]
func (h *EmojiHandler) GetHotEmojis(c *gin.Context) {
	limitStr := c.DefaultQuery("limit", "20")
	limit, _ := strconv.Atoi(limitStr)

	emojis, err := h.service.GetHotEmojis(limit)
	if err != nil {
		response.Error(c, 500, err.Error())
		return
	}

	response.Success(c, emojis, "")
}

